/* 词法文法：
1）TokenType Colon Sapce ReuglarExpression Semicolon
   * Token名以<大写字母>开头
2) 发生词法冲突时的优先级策略：前面的Token类型优先级要高些，
    * 'int'符合两种Token：Int, Idendifier，但Int在前，所以'int'被有限自动机解析为Token.Int
    * '++'必须放在'+'之前，先预读是否符合'++'策略，再根据结果判断是'++'还是'+'，否则永远解析不出'++'*/

lexer grammar HelloLexer;  //lexer关键字意味着这是一个词法规则文件，名称是Hello，要与文件名相同

Int :    'int';    //某关键字词法
String :    'string';    //某关键字词法
Bool :    'bool';    //某关键字词法

If :    'if';    //某关键字词法
Else :    'else';    //某关键字词法
While :    'while';    //某关键字词法
For :    'for';    //某关键字词法
Break :    'break';    //某关键字词法
Continue :    'continue';    //某关键字词法
BTrue :    'true';    //某关键字词法
BFalse :    'false';    //某关键字词法

And :    'and';    //某关键字词法
Or :    'or';    //某关键字词法

IntLiteral :    '0' | [1-9][0-9]*;    //整型字面量词法
StringLiteral :    '"' .*? '"';    //字符串字面量词法

Plus :    '+';    //加号词法，token具有二义性，例如，加号既可以表示数字加法，也可以表示线性表拼接，所以直接以形状命名
Minus :    '-';    //减号词法
Star :    '*';    //星号词法
Slash :    '/';    //斜杠词法

GT :    '>';    //大于词法
LT :    '<';    //小于词法
EQ :    '==';    //等于词法
GE :    '>=';    //大于等于词法
LE :    '<=';    //小于等于词法

Semicolon :    ';';    //分号词法
LPAREN :    '(';
RPAREN :    ')';
LBRACE :    '{';
RBRACE :    '}';

Identifier :    [a-zA-Z][a-zA-Z0-9_]*;    //标识符词法
Assignment :    '=';    //赋值词法

WhiteSpace :    [ \t]+ -> skip;
NewLine : ('\r' '\n'?|'\n')-> skip;
